package 简单.数学;

/**
 * 小区便利店正在促销，用 numExchange 个空酒瓶可以兑换一瓶新酒。你购入了 numBottles 瓶酒。
 * <p>
 * 如果喝掉了酒瓶中的酒，那么酒瓶就会变成空的。
 * <p>
 * 请你计算 最多 能喝到多少瓶酒。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/water-bottles
 */
public class 换酒问题_1518 {

    public static void main(String[] args) {

        System.out.println(efficientNumWaterBottles(15, 4));

    }

    /**
     * 模拟
     *
     * @param numBottles
     * @param numExchange
     * @return
     */
    public static int numWaterBottles(int numBottles, int numExchange) {
        if (numBottles < numExchange) {
            return numBottles;
        }
        int count = 0;
        int preLeaveNull = 0;  //上次交换后留下的空瓶子
        while (numBottles + preLeaveNull >= numExchange) {
            //先喝
            count += numBottles;
            //剩下多少空瓶兑换不了
            int curLeave = (numBottles + preLeaveNull) % numExchange;
            //兑换空瓶子
            numBottles = (numBottles + preLeaveNull) / numExchange;
            preLeaveNull = curLeave;
        }
        //喝掉最后剩下的酒瓶
        count += numBottles;
        return count;
    }

    /**
     * 数学
     * 比如每3个空瓶可以兑换1瓶酒
     * 那么每次兑换总瓶子数量都会减少3-1个瓶子，numBottles/(numExchange-1)可以算出交换的次数
     * 假设买了15瓶酒，4个空瓶可以兑换1瓶酒
     * 注意边界情况：如果能除尽，最后一次兑换是不成立的，因为-1了
     * 15/3=5...0
     *
     * @param numBottles
     * @param numExchange
     * @return
     */
    public static int efficientNumWaterBottles(int numBottles, int numExchange) {
        if (numBottles < numExchange) {
            return numBottles;
        }
        int addBottles = numBottles / (numExchange - 1);
        return (numBottles % (numExchange - 1)) == 0 ? numBottles + addBottles - 1 : numBottles + addBottles;
    }

}
